/*
 * @Author: your name
 * @Date: 2021-04-22 19:46:27
 * @LastEditTime: 2021-04-28 22:14:25
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \JuniorLesson_SecondTerm\EmbeddedSystem\Experiment\实验8-第6次实验-定时器中断实验\timer-v3.0-lc.c
 */
#include "timer.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////     
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK STM32F407开发板
//定时器 驱动代码       
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/4
//版本：V1.0
//版权所有，盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                      
//////////////////////////////////////////////////////////////////////////////////      
extern int status_key0;   // 1-key0按键按下
extern int press_key1;   

//通用定时器3中断初始化
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!

void TIM3_Int_Init(u16 arr,u16 psc){
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  // 使能TIM3时钟
    
      TIM_TimeBaseInitStructure.TIM_Period = arr;         // 自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc;          // 定时器分频, 时钟预分频数
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;     // 向上计数模式
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);    // 初始化TIM3
    
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);             // 允许定时器3更新中断
    TIM_Cmd(TIM3,ENABLE);     // 使能定时器3
    
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;         // 定时器3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;     // 抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;         // 子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
}

// 定时器3中断服务函数
void TIM3_IRQHandler(void){
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET){    // 溢出中断
        if(press_key1) LED1=!LED1; // LED1(绿灯)反相，实现闪烁
        else LED1=1;
        if(status_key0) LED0=!LED0; // LED0(红灯)反相, 实现闪烁
        else LED0=1;
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}
